package com.lfm.customgeneric;

import java.util.ArrayList;
import java.util.List;

public class GenericExtends {
    public static void main(String[] args) {
        Object o = new String("xx");

        //这样是不允许的, 泛型没有继承性
        //List<Object> list = new ArrayList<String>();
        //举例说明 下面三个方法的使用
        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<AA> list3 = new ArrayList<>();
        List<BB> list4 = new ArrayList<>();
        List<CC> list5 = new ArrayList<>();

        //可以接收任意
        printCollection1(list1);//
        printCollection1(list2);//
        printCollection1(list3);
        printCollection1(list4);
        printCollection1(list5);

        //可以接受AA及AA的子类，规定了上限

        //printCollection2(list1);//错误
        //printCollection2(list2);//错误
        printCollection2(list3);
        printCollection2(list4);
        printCollection2(list5);

        //可以接受AA 及AA父类， 规定了下限
        //printCollection3(list1);//ok
        //printCollection3(list2);//false
        //printCollection3(list3);//ok
        //printCollection3(list4);//false
        //printCollection3(list5);//false

    }
    //可以接收任意
    public static void printCollection1(List<?> c) {
        for (Object o : c) {
            System.out.println(c);
        }
    }
    //可以接受AA及AA的子类，规定了上限
    public static void printCollection2(List<? extends AA> c) {
        for (Object o : c) {
            System.out.println(c);
        }

    }
    //可以接受AA 及AA父类， 规定了下限
    public static void printCollection3(List<? super AA> c) {

        for (Object o : c) {
            System.out.println(c);
        }
    }
}
class AA {

}
class BB extends AA {

}
class CC extends BB {

}
